//
//  ZTDataManager.h
//  CoreDataLearn
//
//  Created by zhoutong on 17/4/12.
//  Copyright © 2017年 tong. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person+CoreDataClass.h"

#define NAME_Entity @"Person"
#define NAME_xcdatamodel @"CoreDataLearn"

typedef void(^addDataBlock)(__kindof NSManagedObject *obj);

@interface ZTDataManager : NSObject

+ (ZTDataManager*)shareDataManager;
/**
 对外的上下文管理
 */
@property(nonatomic,strong,readonly)NSManagedObjectContext *managedObjectContext;
/**
 如果是iOS9，则返回nil,
 如果是iOS10，则返回NSPersistentContainer
 该方法的目的主要是便于使用ios10的多线程操作数据库
 */
- (NSPersistentContainer *)getCurrentPersistentContainer;
/**
    增删改查
 */
- (BOOL)addData:(addDataBlock)block;

- (BOOL)deleteData:(NSArray<__kindof NSManagedObject *>*)dataArr;

- (BOOL)updateData;

- (NSArray*)selectData:(NSPredicate*)predicate andSortType:(NSArray<NSSortDescriptor *>*)sortType;
/**
    多表添加和查询
 */
- (BOOL)addData:(addDataBlock)block withEntityName:(NSString*)entityName;

- (NSArray*)selectData:(NSPredicate*)predicate andSortType:(NSArray<NSSortDescriptor *>*)sortType entityName:(NSString*)entityName;
/**
    NSPredicate 中支持的关键词和条件符：
    1、>,<,>=,<=,= 比较运算符。
        如：
        @"salary >= 10000"
    2、字符串操作(包含)：BEGINSWITH、ENDSWITH、CONTAINS
        如：
        @"employee.name BEGINSWITH[cd] '李'" //姓李的员工
        @"employee.name ENDSWITH[c] '梦'"   //以梦结束的员工
        @"employee.name CONTAINS[d] '宗'"   //包含有"宗"字的员工
        注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写，也不区分发音符号。
 
    3、范围：IN ，BWTEEN
        如：
        @"salary BWTEEN {5000,10000}"
        @"address IN {'shanghai','beijing'}"
 
    4、自身:SELF，这个只针对字符数组起作用。
        如：
        NSArray * test = =[NSArray arrayWithObjects: @"guangzhou", @"beijing", @"shanghai", nil];
        @"SELF='beijing'"
 
    5、通配符：LIKE
        LIKE 使用?表示一个字符，*表示多个字符，也可以与c、d 连用。
        如：
        @"car.name LIKE '?he?'" //四个字符中，中间为he
        @"car.name LIKE '*jp'"   //以jp结束
 
    6、逻辑运算符：AND、OR、NOT
 */

@end
